<h1>Ajustar una conecci&oacute;n serial Inal&aacute;mbrica con el hardware Wiring usando Bluetooth</h1>
	
<p>
<table width="656">
   	<tr>
   	<td>
   	<p>Por Mitchell Page Mpag5967 [at] mail.usyd.edu.au <br />
Key Centre of Design Computing and Cognition, University of Sydney , Australia </p>
   	
   	<p>Normalmente deber&iacute;a usar un cable serial USB conectado de su computador a la tarjeta Wiring para recibir datos enviados desde un computador corriendo Processing a su tarjeta. </p>
   	<p>Este tutorial demuestra como ejecutar el mismo proceso, pero inalambricamente usando Bluetooth. Probaremos esto encendiendo y apagando un LED inal&aacute;mbricamente. Necesitar&aacute; usar un adaptador para alimentar su tarjeta en este tutorial. Este tutorial cubre la comunicaci&oacute;n desde su computador a la tarjeta: no desde la tarjeta al computador.</p>
   	<h4>&nbsp;</h4>
   	<p><strong>Equipamento: </strong> </p>
   	<p>Necesitar&aacute; un Bluetooth Dongle para su computador y un Bluetooth Modem para conectar la tarjeta Wiring. Nosotros usamos especificamente lo siguiente </p>
   	<p><a href="http://www.sparkfun.com/products/9434" target="_blank">http://www.sparkfun.com/products/9434</a><a href="http://www.sparkfun.com/commerce/product_info.php?products_id=150" target="_blank"></a> y <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=158" target="_blank">http://www.sparkfun.com/commerce/product_info.php?products_id=158 </a></p>
   	<p>Este tutorial fue desarrollado para un computador corriendo Windows XP Service Pack 2 (el cual ha incluido soporte Bluetooth). No ha sido probado en Mac o Linux.</p>
   	<p>&nbsp;</p>
   	<p><strong>Proceso:</strong></p>
   	<p>Paso 1. Primero necesita instalar el m&oacute;dulo Bluetooth en su computador e instalar los drivers. Si el m&oacute;dulo viene con un CD, introduzca el disco y luego conecte el m&oacute;dulo en un puerto USB libre. En Windows deber&iacute;a detectar autom&aacute;ticamente el dispositivo y si pregunta por drivers, dirijalo al CD_ROM. Una vez hayan sido instalados los drivers, Windows podr&iacute;a necesitar ser reiniciado. </p>
   	<p>Paso 2 . Una vez su computador haya sido reiniciado, conecte su m&oacute;dulo Bluetooth (si no lo ha hecho a&uacute;n). Un &iacute;cono Bluetooth deber&iacute;a aparecer en su barra de tareas (Windows XP SP2 tiene esta caracter&iacute;stica de soporte). Su m&oacute;dulo Bluetooth no est&aacute; asignado ni corriendo como un puerto serial. Ahora necesitamos ajustar el modem en la tarjeta Wiring. </p>
   	<p>Paso 3. Construimos la configuraci&oacute;n como en la Figura 1. Primero que todo conecte su LED a la tarjeta Wiring en cualquier pin, excepto los pines 2 o 3 (hemos usado el Pin 8 en este tutorial). Vea este ejemplo para entender como conectar un LED ( <a href="http://www.wiring.org.co/learning/examples/led_blinks.html">http://wiring.org.co/learning/examples/led_blinks.html </a>). Una vez haya conectado su LED a la tarjeta, es tiempo de conectar su modem Bluetooth, El modem Bluetooth con el que estamos trabajando tiene 4 pines etiquetados, PWR, GND, Rx y Tx. Es muy sencillo: conecte el pin PWR al pin de 5V en Wiring, conecte el pin GND al pin GROUND en Wiring. Despu&eacute;s conecte el pin Rx al pin Tx de Wiring (pin digital 3) y conecte el pin Tx al pin Rx de Wiring (pin digital 2). Una vez este conectado, conecte su adaptador AC a la tarjeta, si todo est&aacute; conectado correctamente un peque&ntilde;o LED verde empezar&aacute; a parpadear en el modem Bluetooth. </p>
   	<p><img src="imgs/bluetooth.gif" width="573" height="488" /></p>
   	<p>FIGURA 1. </p>
   	<p>Paso 4. Ahora necesitamos ajustar una conecci&oacute;n desde su computador al modem Bluetooth. Con su m&oacute;dulo Bluetooth conectado, de doble click en el icono de Bluetooth en la barra de tareas y seleccione &lsquo;ADD&rsquo;. Deber&iacute;a encontrar un dispositivo llamado BlueRadios &ndash; el cual es su modem. Seleccionelo para conectarlo. Preguntar&aacute; por una clave. La clave para el modem Bluetooth que est&aacute; usando es &lsquo;default' (ver <a href="http://www.sparkfun.com/datasheets/RF/BlueSMiRF_v1.pdf" target="_blank">http://www.sparkfun.com/datasheets/RF/BlueSMiRF_v1.pdf </a>). Si usa un modem Bluetooth diferente al que estamos usando, necesitar&aacute; revisar la documentaci&oacute;n para encontrar la clave. Una vez haya ingresado la clave, su computador recordar&aacute; el modem Bluetooth y ser&aacute; capaz de comunicarse con el ahora y en el futuro. </p>
   	<p>Paso 5. Necesitamos encontrar en que puerto COM nuestro comunicaci&oacute;n Bluetooth est&aacute; activa. De doble click en el icono Bluetooth en la barra de tareas otra vez y seleccione el dispositivo BlueRadios de la pesta&ntilde;a de dispositivos, luego de click en la pesta&ntilde;a de COM ports y tome nota del n&uacute;mero del puerto que est&aacute; siendo usado por la conecci&oacute;n Bluetooth. En nuestro caso, el puerto COM es COM7. </p>
   	<p>Paso 6. Ya que ha conectado todos los componentes, necesita cargar su programa en la tarjeta Wiring. NECESITA USAR EL CABLE USB PARA CARGAR EL PROGRAMA &ndash; NO PUEDE USAR BLUETOOTH INAL&Aacute;MBRICO PARA CARGAR LOS PROGRAMAS A LA TARJETA. El c&oacute;digo del programa que usaremos est&aacute; adjunto m&aacute;s abajo. Una vez que haya conectado el cable serial USB, cargue su programa. Una vez haya cargado satisfactoriamente, de reset a su tarjeta y remueva el cable. </p>
   	<p>Paso 7. Ahora necesitamos configurar el c&oacute;digo de Processing. El c&oacute;digo que usaremos est&aacute; adjunto m&aacute;s abajo. Necesita encontrar cual n&uacute;mero en el arreglo es el puerto COM Bluetooth. Corra el c&oacute;digo una vez y tome nota de los puertos COM que aparencen en el panel de salida. </p>
   	<p>Ej. COM1 COM3 COM7 en nuestro caso, el Bluetooth estaba conectado en COM7, el cual es el n&uacute;mero 2 en la posici&oacute;n de nuestro arreglo serial (COM1 = 0, COM3 = 1, COM7 = 2). Luego actualizamos el c&oacute;digo de Processing as&iacute; usar&aacute; la conecci&oacute;n Bluetooth para enviar datos seriales. Una vez haya actualizado este c&oacute;digo, corra el programa otra vez (ver Paso 8). </p>
   	<p>Paso 8. Despu&eacute;s de haber corrido el programa por primera vez, el computador establecer&aacute; una conecci&oacute;n con los modems Bluetooth &ndash; ver&aacute; una luz roja parpadeando en el modem &ndash; finalmente se quedar&aacute; rojo una vez establecida la comunicaci&oacute;n pero puede tomar cerca de 10 segundos ante de poder recibir datos. El proceso de conecci&oacute;n tomar&aacute; cerca de 15 segundos para ajustarse compleatamente. Despu&eacute;s de cerca de 15 o 20 segundos, su programa de Processing estar&aacute; conectado a la tarjeta Wiring <em>inal&aacute;mbricamente </em>. Ahora presione los botones en la interfase de Processing y mire encender y apagar el LED.</p>
   	<p>&nbsp;</p>
   	<p><strong>C&oacute;digo:</strong></p>
   	<p>C&oacute;digo de Wiring &ndash; este c&oacute;digo esperar&aacute; por la se&ntilde;al desde Processing. Cuando recibe una se&ntilde;al 'H', el LED en el pin 8 se encender&aacute;. Cuando recibe una se&ntilde;al 'L' el LED en el pin 8 se apagar&aacute;. </p>
   	<pre>char val;         // varaible para recibir datos desde el puerto serial
int ledpin = 8;  // LED conectado al pin 48 (LED de la tarjeta)


void setup() {
  pinMode(ledpin, OUTPUT);  // pin 48 (LED de la tarjeta) como OUTPUT
  Serial1.begin(9600);          // inicia la comunicaci&oacute;n serial a 9600bps
}


void loop() {
  if( Serial1.available() )         // si data esta disponible para leer
  {
    val = Serial1.read();          // leala y almacenela en 'val'
  }
  if( val == 'H' )                     // si 'H' fue recibida
  {
    digitalWrite(ledpin, HIGH);  // encienda el LED
  } else { 
    digitalWrite(ledpin, LOW);   // de otro modo apaguelo OFF
  }
  delay(100);                         // espere 100ms para la siguiente lectura
}
    </pre>
    <p>&nbsp;</p>
    <p>C&oacute;digo de Processing &ndash; este c&oacute;digo crea dos botones. Cuando se hace click en el bot&oacute;n de la izquierda, enviar&aacute; una se&ntilde;al 'H' a la tarjeta y encender&aacute; el LED o si se hace click en el bot&oacute;n de la derecha, enviar&aacute; una se&ntilde;al 'L' a la tarjeta Wiring para apagar el LED.</p>
    <pre>//importa las clases para ajustar la comunicaci&oacute;n serial con la tarjeta Wiring
import processing.serial.*; 
Serial port; 


//asignaci&oacute;n de botones
color currentcolor;
RectButton rect1, rect2;
boolean locked = false;


void setup() {
  //ajuste de la ventana
  size(200, 200);
  color baseColor = color(102, 102, 102);
  currentcolor = baseColor;
  
  // La lista de los puertos seriales disponibles en el panel de salida. 
  // Necesitar&aacute; escoger de la lista el puerto al que Wiring est&aacute; 
  // conectada. El primer puerto en la lista es  
  // el puero #0 y el tercer puerto en la lista es el puerto #2. 
  println(Serial.list()); 
  
  // Abra el puerto al que est&aacute; conectada Wiring (en este caso 1
  // el cual es el segundo puerto abierto en el arreglo) 
  // Asegurese abrir el puerto a la misma velocidad usada en Wiring (9600bps) 
  port = new Serial(this, Serial.list()[1], 9600);
  
  // Defina y cree un bot&oacute;n rectangular #1
  int x = 30;
  int y = 100;
  int size = 50;
  color buttoncolor = color(153, 102, 102);
  color highlight = color(102, 51, 51); 
  rect1 = new RectButton(x, y, size, buttoncolor, highlight);
  
  // Defina y cree un bot&oacute;n rectangular #2
  x = 90;
  y = 100; 
  size = 50;
  buttoncolor = color(153, 153, 153);
  highlight = color(102, 102, 102); 
  rect2 = new RectButton(x, y, size, buttoncolor, highlight);
}


void draw() {
  background(currentcolor);
  stroke(255);
  update(mouseX, mouseY);
  rect1.display();
  rect2.display();
}


void update(int x, int y) {
  if(locked == false) {
  
    rect1.update();
    rect2.update();
  } else {
    locked = false;
  }
  
  //Enciende y apaga el LED si el bot&oacute;n est&aacute; presionado donde
  //H = encendido (high) y L = apagado (low)
  if(mousePressed) {
    if(rect1.pressed()) {            //boton ON
      currentcolor = rect1.basecolor;
      port.write('H');
    } else if(rect2.pressed()) {    //boton OFF
      currentcolor = rect2.basecolor;
      port.write('L');
    }
  }
}


class Button {
  int x, y;
  int size;
  color basecolor, highlightcolor;
  color currentcolor;
  boolean over = false;
  boolean pressed = false;   
  
  void update() {
    if(over()) {
      currentcolor = highlightcolor;
    } else {
      currentcolor = basecolor;
    }
  }
  
  boolean pressed() {
    if(over) {
      locked = true;
      return true;
    } else {
      locked = false;
      return false;
    }    
  }
  
  boolean over() { 
    return true; 
  }
  
  void display() { 
  
  }
}

class RectButton extends Button {
  RectButton(int ix, int iy, int isize, color icolor, color ihighlight) {
    x = ix;
    y = iy;
    size = isize;
    basecolor = icolor;
    highlightcolor = ihighlight;
    currentcolor = basecolor;
  }
  
  boolean over() {
    if( overRect(x, y, size, size) ) {
      over = true;
      return true;
    } else {
      over = false;
      return false;
    }
  }
  
  void display() {
    stroke(255);
    fill(currentcolor);
    rect(x, y, size, size);
  }
}

boolean overRect(int x, int y, int width, int height) {
  if (mouseX &gt;= x &amp;&amp; mouseX &lt;= x+width &amp;&amp; 
      mouseY &gt;= y &amp;&amp; mouseY &lt;= y+height) {
    return true;
  } else {
    return false;
  }
}
</pre></td>
  </tr>
  </table>
</p>
